﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entities;
using Business;
using DevComponents.DotNetBar;
namespace Presentation
{
    public partial class frmLapHoaDon : DevComponents.DotNetBar.Office2007Form
    {
        KhachHangDTO kh;
        SachDTO s;
        ErrorProvider error = new ErrorProvider();          
        public frmLapHoaDon()
        {
            InitializeComponent();
            dgvDanhSach.Columns.Add("STT", "STT");

            dgvDanhSach.Columns["STT"].Width = 50;
            dgvDanhSach.Columns["STT"].ReadOnly = true;

            dgvDanhSach.Columns.Add("MaSach", "Mã sách");

            dgvDanhSach.Columns.Add("TenSach", "Tên sách");
            dgvDanhSach.Columns["TenSach"].ReadOnly = true;

            dgvDanhSach.Columns.Add("TheLoai", "Thể loại");
            dgvDanhSach.Columns["TheLoai"].ReadOnly = true;

            dgvDanhSach.Columns.Add("TacGia", "Tác giả");
            dgvDanhSach.Columns["TacGia"].ReadOnly = true;

            dgvDanhSach.Columns.Add("SoLuongTon", "Số lượng tồn");
            dgvDanhSach.Columns["SoLuongTon"].ReadOnly = true;

            dgvDanhSach.Columns.Add("DonGia", "Đơn giá");
            dgvDanhSach.Columns["DonGia"].ReadOnly = true;
            dgvDanhSach.Columns["DonGia"].DefaultCellStyle.Format = "$00,000";

            dgvDanhSach.Columns.Add("SoLuongBan", "Số lượng bán");
            dgvDanhSach.Columns.Add("DonGiaBan", "Đơn giá bán");
            dgvDanhSach.Columns["DonGiaBan"].DefaultCellStyle.Format = "000,000";
            dgvDanhSach.Columns.Add("ThanhTien", "Thành tiền");
            dgvDanhSach.Columns["ThanhTien"].DefaultCellStyle.Format = "$00,000";
            dgvDanhSach.Columns["ThanhTien"].ReadOnly = true;

           
        }
         
        private void frmLapHoaDon_Load(object sender, EventArgs e)
        {
            LapHoaDonMoi();
        }

        private void txtMaKhachHang_TextChanged(object sender, EventArgs e)
        {
            int maKhachHang = -1;
            if (int.TryParse(txtMaKhachHang.Text, out maKhachHang))
            {
                LoadThongTin(maKhachHang);
            }
        }
        private void LoadThongTin(int maKhachHang)
        {
            kh = KhachHangService.GetKhachHangByMaKhachHang(maKhachHang);
            if (kh != null)
            {
                txtTenKhachHang.Text = kh.HoTen;
                txtDiaChi.Text = kh.DiaChi;
                txtSoDienThoai.Text = kh.DienThoai;
                txtEmail.Text = kh.Email;
                txtTienNo.Text = kh.TienNo.ToString();
            }

        }
        private void textBoxX1_TextChanged(object sender, EventArgs e)
        {
            int maSach = -1;
            if (int.TryParse(txtMaSach.Text, out maSach))
            {
                LoadThongTinSach(maSach);
            }
        }
        private void LoadThongTinSach(int masach)
        {
            s = SachService.GetSachByMaSach(masach);
            if(s!=null)
            {
                txtTenSach.Text = s.TenSach;
                txtTonKho.Text = s.SoLuong.ToString();
                txtGia.Text = s.DonGia.ToString();
                txtTacGia.Text = TacGiaService.GetTacGiaByMaTacGia(s.MaTacGia).TenTacGia;
                txtTheLoai.Text = TheLoaiService.GetTheLoaiByMaLoai(s.MaTheLoai).TenTheLoai;
                DataGridViewRow row = dgvDanhSach.Rows[0];
                row.ErrorText = "";
                row.Cells["MaSach"].Value = masach;
                row.Cells["TenSach"].Value = s.TenSach;
                row.Cells["TheLoai"].Value = TheLoaiService.GetTheLoaiByMaLoai(s.MaTheLoai).TenTheLoai;
                row.Cells["TacGia"].Value = TacGiaService.GetTacGiaByMaTacGia(s.MaTacGia).TenTacGia;
                row.Cells["SoLuongTon"].Value = s.SoLuong;
                row.Cells["DonGia"].Value = s.DonGia;
                dgvDanhSach.Rows[0].Selected = true;
                this.dgvDanhSach.CurrentCell = this.dgvDanhSach["SoLuongBan", 0];
                dgvDanhSach.BeginEdit(true);
            }
        }
        private void dgvDanhSach_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            DataGridViewRow row = dgvDanhSach.Rows[e.RowIndex];
            int i = -1;

            if (dgvDanhSach.Columns[e.ColumnIndex].Name == "MaSach" && e.RowIndex < dgvDanhSach.Rows.Count - 1)
            {
                if (!int.TryParse(e.FormattedValue.ToString(), out i))
                {
                    e.Cancel = true;
                    dgvDanhSach.Rows[e.RowIndex].ErrorText = "Phải nhập số nguyên!";
                    return;
                }
                SachDTO s = new SachDTO();
                s = SachService.GetSachByMaSach(i);
                if (s == null)
                {
                    e.Cancel = true;
                    dgvDanhSach.Rows[e.RowIndex].ErrorText = "Không tồn tại mã sách này!";
                }
                else
                {
                    row.ErrorText = "";
                    row.Cells["TenSach"].Value = s.TenSach;
                    row.Cells["TheLoai"].Value = TheLoaiService.GetTheLoaiByMaLoai(s.MaTheLoai).TenTheLoai;
                    row.Cells["TacGia"].Value = TacGiaService.GetTacGiaByMaTacGia(s.MaTacGia).TenTacGia;
                    row.Cells["SoLuongTon"].Value = s.SoLuong;
                    row.Cells["DonGia"].Value = s.DonGia;
                }
                return;
            }
            if (dgvDanhSach.Columns[e.ColumnIndex].Name == "SoLuongBan" && e.RowIndex < dgvDanhSach.Rows.Count - 1)
            {

                if (!int.TryParse(row.Cells["MaSach"].FormattedValue.ToString(), out i))
                {
                    dgvDanhSach.Rows[e.RowIndex].ErrorText = "Chưa nhập mã sách!";
                    return;
                }
                if (!int.TryParse(e.FormattedValue.ToString(), out i) || i <= 0)
                {
                    e.Cancel = true;
                    dgvDanhSach.Rows[e.RowIndex].ErrorText = "Phải nhập số nguyên dương!";
                    return;
                }
                ThamSoDTO tonSauBan = ThamSoService.GetThamSoByMaThamSo(4);
                int soLuongTon = int.Parse(row.Cells["SoLuongTon"].FormattedValue.ToString());
                if (((tonSauBan.SuDung == 1 && soLuongTon - i < tonSauBan.GiaTri)) || soLuongTon < i)
                {
                    e.Cancel = true;
                    dgvDanhSach.Rows[e.RowIndex].ErrorText = "Số lượng bán nhiều hơn qui định!";
                    return;
                }
                row.Cells["DonGiaBan"].Value = row.Cells["DonGia"].Value;

                dgvDanhSach.Rows[0].Selected = true;
                this.dgvDanhSach.CurrentCell = this.dgvDanhSach["SoLuongBan", e.RowIndex];
                dgvDanhSach.BeginEdit(true);
                row.ErrorText = "";
            }
            if (dgvDanhSach.Columns[e.ColumnIndex].Name == "DonGiaBan" && e.RowIndex < dgvDanhSach.Rows.Count - 1)
            {
                double giaBan = -1;
                if (!double.TryParse(e.FormattedValue.ToString(), out giaBan))
                {
                    row.ErrorText = "Giá bán phải là số!";
                    e.Cancel = true;
                    return;
                }
                int soLuongBan = -1;
                if (!int.TryParse(row.Cells["SoLuongBan"].FormattedValue.ToString(), out soLuongBan))
                {
                    row.ErrorText = "Chưa nhập số lượng bán!";
                    return;
                }
                row.ErrorText = "";
                row.Cells["ThanhTien"].Value = giaBan * soLuongBan;
            }

        }
        private void txtMaKhachHang_Validating(object sender, CancelEventArgs e)
        {
            
            int maKhachhang = -1;
            if (!int.TryParse(txtMaKhachHang.Text, out maKhachhang))
            {
                error.SetError(txtMaKhachHang, "Mã khách hàng là số nguyên!");
                e.Cancel = true;
                txtMaKhachHang.Focus();
                return;
            }

            error.SetError(txtMaKhachHang, "");
            KhachHangDTO kh = KhachHangService.GetKhachHangByMaKhachHang(maKhachhang);
            if (kh == null)
            {

                error.SetError(txtMaKhachHang, "Mã khách hàng không tồn tại!");
                txtTenKhachHang.Text = "";
                txtDiaChi.Text = "";
                txtSoDienThoai.Text = "";
                txtEmail.Text = "";
                txtTienNo.Text = "";
                
                
                return;
            }

            txtTenKhachHang.Text = kh.HoTen;
            txtDiaChi.Text = kh.DiaChi;
            txtSoDienThoai.Text = kh.DienThoai;
            txtEmail.Text = kh.Email;
            txtTienNo.Text = kh.TienNo.ToString();
            e.Cancel = false;
            ThamSoDTO tienNoToiDa=ThamSoService.GetThamSoByMaThamSo(3);
            if (tienNoToiDa.SuDung == 1 && kh.TienNo >= tienNoToiDa.GiaTri)
            {
                e.Cancel = true;
                error.SetError(txtTienNo, "Tiền nợ quá nhiều!");
                return;
            }

        }

        private void txtMaKhachHang_Validated(object sender, EventArgs e)
        {            
            error.SetError(txtMaKhachHang, "");
            error.SetError(txtTienNo, "");
        }

       

        private void btnTimSach_Click(object sender, EventArgs e)
        {
            frmTraCuuSach frm = new frmTraCuuSach();
            frm.fromOtherForm = true;
            frm.ShowDialog();
            this.txtMaSach.Text = frm.maSach.ToString();
        }
        private void btnLapHoaDon_Click(object sender, EventArgs e)
        {
            LapHoaDon();
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            dgvDanhSach.Rows[0].ErrorText = "";
            this.Close();
        }

        private bool LapHoaDon()
        {
            DataGridViewRow row;
            List<ChiTietHoaDonDTO> list = new List<ChiTietHoaDonDTO>();
            double tongTien=0;
            int maHoaDon=int.Parse(txtMaHoaDon.Text);            
            int maKhachHang = -1;
            if (!int.TryParse(txtMaKhachHang.Text, out maKhachHang))
            {
                MessageBoxEx.Show("Chưa nhập mã khách hàng", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtMaKhachHang.Focus();
                return false;
            }
            if (KhachHangService.GetKhachHangByMaKhachHang(maKhachHang) == null)
            {
                MessageBoxEx.Show("Không tồn tại mã khách hàng này!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtMaKhachHang.Focus();
                txtMaKhachHang.SelectAll();
                return false;
            }
            if (dgvDanhSach.Rows.Count <= 1)
            {
                MessageBoxEx.Show("Không thể lập hóa đơn", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

             #region //Lấy báo cáo tồn của tháng lập hóa đơn

                //
                bool tonTai = BaoCaoTonService.Exists(dtiNgayLap.Value);
                BaoCaoTonDTO baoCaoTon;
                int maBaoCaoTon = BaoCaoTonService.GetCurrentID() + 1;
                if (tonTai)
                {
                    baoCaoTon = BaoCaoTonService.GetBaoCaoTonByThang(dtiNgayLap.Value);
                }
                else
                {
                    baoCaoTon = new BaoCaoTonDTO();
                    baoCaoTon.TinhTrang = 1;
                    baoCaoTon.Thang = dtiNgayLap.Value;
                    BaoCaoTonService.Insert(baoCaoTon);
                }
                #endregion
            for (int i = 0; i < dgvDanhSach.Rows.Count - 1; i++)
            {
                row = dgvDanhSach.Rows[i];
                if (row.Cells["MaSach"].Value == null)
                {
                    MessageBoxEx.Show("Không thể lập hóa đơn", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    row.ErrorText = "Chưa nhập mã sách!";

                    return false;
                }
                if (row.Cells["SoLuongBan"].Value == null)
                {
                    MessageBoxEx.Show("Không thể lập hóa đơn", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    row.ErrorText = "Chưa nhập số lượng bán!";

                    return false;
                } if (row.Cells["DonGiaBan"].Value == null)
                {
                    MessageBoxEx.Show("Không thể lập hóa đơn", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    row.ErrorText = "Chưa nhập đơn giá bán!";

                    return false;
                }
               
                //Tạo danh sách các ChiTietHoaDonDTO
                int soLuongBan=int.Parse(row.Cells["SoLuongBan"].Value.ToString());
                double donGiaBan = double.Parse(row.Cells["DonGiaBan"].FormattedValue.ToString());
                ChiTietHoaDonDTO ct = new ChiTietHoaDonDTO();
                ct.MaHoaDon = maHoaDon;
                ct.MaSach = int.Parse(row.Cells["MaSach"].Value.ToString());
                ct.SoLuongBan = soLuongBan;
                ct.DonGiaBan=donGiaBan;
                list.Add(ct);
                tongTien += (soLuongBan * donGiaBan);
                this.txtTongTien.Text = tongTien.ToString();
                this.txtNoMoi.Text = (kh.TienNo + tongTien).ToString();
                
                  #region //Xử lý nhập cho báo cáo tồn
                if (tonTai)
                {                    
                    if (ChiTietBaoCaoTonService.Exists(baoCaoTon.MaBaoCaoTon, ct.MaSach))
                    {
                        ChiTietBaoCaoTonDTO chiTiet = ChiTietBaoCaoTonService.GetChiTietBaoCaoTon(baoCaoTon.MaBaoCaoTon, ct.MaSach);
                        chiTiet.PhatSinh = chiTiet.PhatSinh-ct.SoLuongBan;
                        chiTiet.TonCuoi = chiTiet.TonDau + chiTiet.PhatSinh;
                        ChiTietBaoCaoTonService.Update(chiTiet);
                    }
                    else
                    {
                        ChiTietBaoCaoTonDTO chiTietBaoCaoTon = new ChiTietBaoCaoTonDTO();
                        chiTietBaoCaoTon.MaBaoCaoTon = baoCaoTon.MaBaoCaoTon;
                        chiTietBaoCaoTon.MaSach = ct.MaSach;
                        chiTietBaoCaoTon.TonDau = SachService.GetSachByMaSach(ct.MaSach).SoLuong;
                        chiTietBaoCaoTon.PhatSinh = -ct.SoLuongBan;
                        chiTietBaoCaoTon.TonCuoi = chiTietBaoCaoTon.TonDau + chiTietBaoCaoTon.PhatSinh;
                        ChiTietBaoCaoTonService.Insert(chiTietBaoCaoTon);
                    }
                }
                else
                {

                    ChiTietBaoCaoTonDTO chiTietBaoCaoTon = new ChiTietBaoCaoTonDTO();
                    chiTietBaoCaoTon.MaBaoCaoTon = maBaoCaoTon;
                    chiTietBaoCaoTon.MaSach = ct.MaSach;
                    chiTietBaoCaoTon.TonDau = SachService.GetSachByMaSach(ct.MaSach).SoLuong;
                    chiTietBaoCaoTon.PhatSinh = -ct.SoLuongBan;
                    chiTietBaoCaoTon.TonCuoi = chiTietBaoCaoTon.TonDau + chiTietBaoCaoTon.PhatSinh;
                    ChiTietBaoCaoTonService.Insert(chiTietBaoCaoTon);

                }
                #endregion
            }
            #region //Xử lý nhập cho báo cáo công nợ
            HoaDonDTO hd = new HoaDonDTO();
        
            hd.TinhTrang = 1;
            hd.NgayLap = dtiNgayLap.Value;
            hd.MaHoaDon = maHoaDon;
            hd.MaKhachHang = int.Parse(txtMaKhachHang.Text);
            hd.TongTien = tongTien;
            HoaDonService.Insert(list, hd);
            int maBaoCaoCongNo;
            BaoCaoCongNoDTO baoCaoCongNo;
            if (BaoCaoCongNoService.Exists(hd.NgayLap))
            {
                baoCaoCongNo = BaoCaoCongNoService.GetBaoCaoCongNoByThang(hd.NgayLap);
                maBaoCaoCongNo=baoCaoCongNo.MaBaoCaoCongNo;
            }
            else
            {
                baoCaoCongNo = new BaoCaoCongNoDTO();
                baoCaoCongNo.Thang=hd.NgayLap;
                baoCaoCongNo.TinhTrang=1;
                BaoCaoCongNoService.Insert(baoCaoCongNo);
                maBaoCaoCongNo=BaoCaoCongNoService.GetCurrentID();
            }

            if (ChiTietBaoCaoCongNoService.Exists(maBaoCaoCongNo, hd.MaKhachHang))
            {
                ChiTietBaoCaoCongNoDTO chiTietCongNo = ChiTietBaoCaoCongNoService.GetChiTietBaoCao(maBaoCaoCongNo, hd.MaKhachHang);
                chiTietCongNo.PhatSinh += hd.TongTien;
                chiTietCongNo.NoCuoi = chiTietCongNo.PhatSinh + chiTietCongNo.NoDau;
                ChiTietBaoCaoCongNoService.Update(chiTietCongNo);
            }
            else
            {
                ChiTietBaoCaoCongNoDTO chiTietCongNo = new ChiTietBaoCaoCongNoDTO();
                chiTietCongNo.MaKhachHang = hd.MaKhachHang;
                chiTietCongNo.MaBaoCaoCongNo = maBaoCaoCongNo;
                chiTietCongNo.NoDau = 0;
                chiTietCongNo.PhatSinh = hd.TongTien;
                chiTietCongNo.NoCuoi = chiTietCongNo.PhatSinh + chiTietCongNo.NoDau;
                ChiTietBaoCaoCongNoService.Insert(chiTietCongNo);
            }
            #endregion
            dgvDanhSach.ReadOnly = true;
            MessageBoxEx.Show("Đã lập hóa đơn!", "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            btnLapHoaDon.Enabled = false;
            return true;
        }

        private void frmLapHoaDon_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (dgvDanhSach.RowCount <= 1)
            {
                return;
            }
            if (btnLapHoaDon.Enabled)
            {
                DialogResult r = MessageBoxEx.Show("Bạn có muốn lưu Hóa đơn?", "Thông báo!", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if (r == DialogResult.Cancel)
                {
                    e.Cancel = true;

                }
                else if (r == DialogResult.Yes)
                {
                    if (!LapHoaDon())
                        e.Cancel = true;
                }
            }
        }

        private void btnTimKhachHang_Click(object sender, EventArgs e)
        {
            frmTraCuuKhachHang frm = new frmTraCuuKhachHang();
            frm.fromOtherForm = true;
            frm.ShowDialog();
            this.txtMaKhachHang.Text = frm.maKhachHang.ToString();
        }

               
        private void btnLapHoaDonMoi_Click(object sender, EventArgs e)
        {
            LapHoaDonMoi();
        }
        private void LapHoaDonMoi()
        {
            int id = HoaDonService.GetCurrentID();
            if (id == 1 && !HoaDonService.Exists(1))
                id = 0;
            txtMaHoaDon.Text = (id + 1).ToString();
            dtiNgayLap.Value = DateTime.Now;
            btnLapHoaDon.Enabled = true;
            dgvDanhSach.Rows.Clear();
            dgvDanhSach.ReadOnly = false;
            txtMaKhachHang.Text = "";
            txtTenKhachHang.Text = "";
            txtDiaChi.Text = "";
            txtSoDienThoai.Text = "";
            txtEmail.Text = "";
            txtTienNo.Text = "";
        }

        private void dgvDanhSach_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            if (e.RowIndex == dgvDanhSach.RowCount - 1)
                return;
            for (int i = 0; i < dgvDanhSach.ColumnCount; i++)
            {
                if (dgvDanhSach[i, e.RowIndex].EditedFormattedValue.ToString() == "" &&dgvDanhSach.Columns[i].Name!="ThanhTien")
                {
                    dgvDanhSach.CurrentCell = dgvDanhSach[i, e.RowIndex];
                    dgvDanhSach.BeginEdit(true);
                    e.Cancel = true;
                    return;
                }
            }
            dgvDanhSach["ThanhTien", e.RowIndex].Value = (double)int.Parse(dgvDanhSach["SoLuongBan",e.RowIndex].EditedFormattedValue.ToString()) * double.Parse(dgvDanhSach["DonGiaBan", e.RowIndex].EditedFormattedValue.ToString());
            
        }

        private void dgvDanhSach_UserAddedRow(object sender, DataGridViewRowEventArgs e)
        {           
            dgvDanhSach["STT",e.Row.Index-1].Value=e.Row.Index;
        }

        private void btnIn_Click(object sender, EventArgs e)
        {

        }
    }
}
